(function () {
  const _dataSource = Symbol('_dataSource')
  class Queue {
    constructor(props = {}) {
      Object.defineProperties(this, {
        [_dataSource]: {
          writable: false,
          enumerable: false,
          value: props.dataSource || []
        }
      })
    }
    // 入队
    enqueue(element) {
      this[_dataSource].push(element);
      return element;
    }
    // 出队
    dequeue() {
      return this[_dataSource].shift();
    }
    // 对长
    len() {
      return this[_dataSource].length;
    }
    // 查看对头元素
    front() {
      return this[_dataSource][0];
    }
    // 查看对尾元素
    back() {
      return this[_dataSource][this[_dataSource].length - 1];
    }
  }
  if (typeof module !== 'undefined' && typeof module.exports !== 'undefined' && typeof exports !== 'undefined') {
    module.exports = Queue;
  } else if (typeof window) {
    window.Queue = Queue;
  }
})();
